import router from '@/router'
import { useUserStore } from '@/stores/user'
import axios, { type AxiosResponse, type InternalAxiosRequestConfig, type Method } from 'axios'
import { ElMessage } from 'element-plus'



// 创建axios实例
const instance = axios.create({
  baseURL: 'http://geek.itheima.net/',
  timeout: 5000
})

interface Result<T> {
  message: string
  data: T
}

// 请求工具函数封装
export const request = <T>(url: string, method: Method = 'GET', submitData?: object) => {
  // request(默认data类型, 后端返回值类型)
  return instance.request<T,Result<T>>({
    url,
    method,
    // []  插值表达式 动态设置 对象的键名称
    // 请求参数：GET 请求用 params，否则用 data
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData
  })
}

// 请求拦截器
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 在发送请求之前做些什么，比如添加 token
    const store = useUserStore()
    if (store) {
      config.headers.Authorization = `Bearer ${store.token}`
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    if (response.status >= 200 && response.status < 300) {
      return response.data
    } else if (response.status === 401) {
      ElMessage.error('登录过期，请重新登录')
      router.push('/login')
      return Promise.reject(response)
    } else {
      ElMessage.error(response.data?.message)
      return Promise.reject(response)
    }
  },
  (error) => {
    // 如果后端有错误响应（如果没网络就不会进入到判断条件内部）
    if (error.response) {
      // 提示错误信息
      ElMessage.error(error.response.data.msg)
      // 状态码判断，是否登录信息无效
      // 如果错误响应存在且状态码为401（未授权）
      if (error.response && error.response.status === 401) {
        // 存储当前页面的路径
        // 存储当前页面的路径，以便后续重定向
        localStorage.setItem('redirectPath', router.currentRoute.value.fullPath);
        // 跳转到登录页，要求用户重新登录
        router.push('/login')
        // 清除token信息
        const store = useUserStore()
        store.clearToken()
      }
    } else {
      // 清除token信息
      ElMessage.error('网络错误，请稍后重试')
    }
    // 对响应错误做点什么
    return Promise.reject(error);
  }
)

// 导出axios实例
export default instance
